import numpy as np
import cv2 as cv

drawing = False  # 如果按下鼠标，则为真
mode = True  # 如果为真，绘制矩形。按 m 键可以切换到曲线
ix, iy = -1, -1


# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    global ix, iy, drawing, mode
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv.rectangle(
                    img, (ix, iy), (x, y), (0, 255, 0), -1
                )  # 将参数-1改为一个正整数，表示矩形的线宽，如修改参数为2，表示绘制矩形的线宽为2个像素，这样就可以绘制一个未填充的矩形
            else:
                cv.circle(img, (x, y), 5, (0, 0, 255), -1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv.rectangle(
                img, (ix, iy), (x, y), (0, 255, 0), -1
            )  # 将参数-1改为一个正整数，表示矩形的线宽，如修改参数为2，表示绘制矩形的线宽为2个像素，这样就可以绘制一个未填充的矩形
        else:
            cv.circle(img, (x, y), 5, (0, 0, 255), -1)


# 创建一个黑色的图像，一个窗口，并绑定到窗口的功能
img = np.zeros((512, 512, 3), np.uint8)
# (512, 512, 3)表示创建一个形状为512行、512列、3个通道的三维数组。这通常用于表示彩色图像，其中512x512是图像的高度和宽度，3表示图像的通道数（红、绿、蓝）。
# np.uint8表示数组的数据类型为无符号8位整数。这意味着数组中的每个元素都是一个范围在0到255之间的整数。
# 通过将数组初始化为全零，可以创建一个黑色的图像，因为在RGB颜色空间中，(0, 0, 0)表示黑色。
cv.namedWindow("image")
cv.setMouseCallback("image", draw_circle)
while 1:
    cv.imshow("image", img)
    if cv.waitKey(20) & 0xFF == 27:
        break
cv.destroyAllWindows()
